///////////////////////////////////////////////////////////////////////////////
// File:        SRP6.hpp
// Author:      671643387@qq.com
// Description:
///////////////////////////////////////////////////////////////////////////////

#ifndef SHARED_AUTH_SRP6_HPP_
#define SHARED_AUTH_SRP6_HPP_

#if defined(_MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

#include "auth/Sha1.hpp"
#include "auth/BigNumber.hpp"

///////////////////////////////////////////////////////////////////////////////
class SRP6
{
public:
    ///////////////////////////////////////////////////////////////////////////
    const static int s_BYTE_SIZE = 32;

public:
    ///////////////////////////////////////////////////////////////////////////
    SRP6(void);
    ~SRP6(void);

public:
    ///////////////////////////////////////////////////////////////////////////
    void SetP(const char* P);
    void SetVS(const char* v, const char* s);

    ///////////////////////////////////////////////////////////////////////////
    BigNumber& Get_N(void) { return N_; }
    BigNumber& Get_s(void) { return s_; }
    BigNumber& Get_g(void) { return g_; }
    BigNumber& Get_v(void) { return v_; }
    BigNumber& Get_B(void) { return B_; }
    BigNumber& Get_K(void) { return K_; }
    BigNumber& Get_RP(void) { return reconnectProof_; }

    ///////////////////////////////////////////////////////////////////////////
    void DoCalculateStepOne(void);
    void DoCalculateStepTwo(BigNumber& A, BigNumber& M, const std::string& I);

private:
    ///////////////////////////////////////////////////////////////////////////
    BigNumber   N_, s_, g_, v_;
    BigNumber   b_, B_;
    BigNumber   K_;
    BigNumber   reconnectProof_;
};

#endif /* SHARED_AUTH_SRP6_HPP_ */
